const http = require("http")
const fs = require('fs')
const app = http.createServer((req,res)=>{
    /**
     * 接口包含哪些：
     *  请求地址：
     *  请求方式：
     *  请求参数：
     * 实现获取书籍的接口
     *  请求地址：/getBooks
     *  请求方式：get
     *  请求参数：
     *      可选参数：name：书籍名称
     *      当用户传入了参数，则根据书籍名称请求对应的数据
     *      当用户没有传入参数，则直接返回整个数据
     *  
     * */ 
    let url = req.url // (请求路径端口后面的那一部分路径，也就是包含参数)
    // console.log(url); // /getBooks?name=三国演义
    // 我们得想办法吧参数和路径分开，如何做，答？split
    let arr = url.split("?") 
    // console.log(arr)  [ '/getBooks', 'name=%E4%B8%89%E5%9B%BD%E6%BC%94%E4%B9%89' ]
    let method = req.method
    res.setHeader("content-type", "text/html;charset=utf8")
    if(arr[0] === "/getBooks" && method === 'GET'){
        // 两个条件都满足说明 前端请求的接口是没有问题的
        // 所以这里就可以根据需求，然后返回数据给前端
        let total = fs.readFileSync('./db/books.json','utf-8')
        // 设置返回给前端的数据编码类型
        res.setHeader("content-type","application/json;charset=utf8")
        if(arr[1]){
            // 有参数
            // 此刻我们拿到的参数为：'name=%E4%B8%89%E5%9B%BD%E6%BC%94%E4%B9%89'
            // 那么我们如何获取到name对应的值呢？
            // 答：URLSearchParams可以通过这个方法来解析
            // 语法： new URLSearchParams(需要解析的参数)会返回处理后的数据对象
            let query =new URLSearchParams(arr[1])
            // console.log(36,query); //  { 'name' => '三国演义' }
            // 返回的数据对象，和js中对象有所不同，那么如何根据字段名获取对相应值呢？
            // 答：可以通过URLSearchParams提供的get方法来获取
            let name = query.get('name')
            // 将数据数组转换为对象
            let totalArr = JSON.parse(total)
            // 根据搜索的名字 过滤目标数据
            let result = totalArr.filter(item=>{
                return item.name == name
            })
            // 将过滤出来的数据返回给前端
            res.end(JSON.stringify(result))
        }else{
            res.end(total)
        }
    }else{
        // 前端请求的接口错误
        // 也就是找不到前端请求的接口，返回404给前端
        res.statusCode = 404
        res.end('not found!')
    }
    // res.end('ok')
})
app.listen(3000,()=>{
 console.log("服务器启动成功：http://127.0.0.1:3000");
})